package com.atgugiu.seckill.schedule;

import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.concurrent.CompletableFuture;

/**
 * 定时任务
 * 1、@EnableScheduling开启定时任务
 * 2、@Scheduled开启一个定时任务
 * 3、自动配置类：设置TaskSchedulingProperties
 * 异步任务
 * 1、@EnableAsync
 * 2、@Async给希望异步执行的方法加上标注
 * 3、自动配置类TaskExecutionAutoConfiguration属性绑定在TaskExecutionProperties
 */
@Slf4j
@Component
public class HelloSchedule {

  /**
   * spring中6位组成，不允许第7位的年
   * 在周几的位置，1-7位代表周一到周日，mon-sun
   * 定时任务不应该阻塞,默认阻塞
   * 1、异步运行业务，自己提交到线程池
   * CompletableFuture.runAsync(()-> {
   * xxxService.hello();
   * },executor)
   * 2、定时任务线程池
   * 设置TaskSchedulingProperties: spring.task.scheduling.pool.size=5，不一定好用
   * 3、让定时任务异步执行
   * 异步任务
   * 解决：使用异步+定时任务来完成任务不阻塞的功能
   *
   * @throws InterruptedException
   */
  @Scheduled(cron = "* * * ? * 5")
  @Async
  public void hello() {

    log.info("hello...");
  }
}
